using System;
using System.Collections.Generic;
using System.Text;

namespace ihm
{
    public class Message
    {
        public static int lastId = 0;

        private int id;
        public int Id { get {return this.id;}  private set { }  }

        private TypeMessage type;
        public TypeMessage Type { get { return this.type; } private set { } }

        private TypeObjet typeObjet;
        public TypeObjet TypeObjet_t { get { return this.typeObjet; } private set { } }

        private int idObjet;
        public int IdObjet { get { return this.idObjet; } private set { } }

        private String message;
        public String Message_t { get { return this.message; } private set { } }

        private DateTime date;
        public DateTime Date { get { return this.date; } private set { } }

        public enum TypeMessage {Erreur = 0, Requete, Reponse, Information}

        public enum TypeObjet {SystemeGlobal = 0, Imprimante, CapteurArriveePiece, CapteurArriveeCarton, MiseEnPalette, CapteurArriveePalette, Carton, Palette, Lot, Commande, Plastifieur};

        public String getFormattedNetworkMessage()
        {
            return id+":"+this.getTypeMessageFromEnum(type)+":"+  getTypeObjetFromEnum(typeObjet)+":"+idObjet+":"+message+":"+DateTime.Now.ToString("hh:mm:ss");
        }

        #region Constructeur

        public Message(TypeObjet _typeSender, TypeMessage _type, int _idObjet, String _message)
        {
            this.setMessage(_typeSender, _type, _idObjet, _message);
        }

        public Message(String message)
        {
            this.setMessage(message);
        }

        #endregion

        #region Setteurs

        public void setMessage(TypeObjet _typeSender, TypeMessage _type, int _idObjet, String _message)
        {
            this.id = Message.lastId++;
            this.type = _type;
            this.typeObjet = _typeSender;
            this.idObjet = _idObjet;
            this.message = _message;
            this.date = DateTime.Now;
        }

        public void setMessage(String s)
        {
            String[] parsedString = s.Split(':');
            if (parsedString.Length != 8)
                throw new Exception("Format de message incorrect");
            try
            {
                this.id = Int32.Parse(parsedString[0]);
                this.type = this.getTypeMessageFromInt(Int32.Parse(parsedString[1]));
                this.typeObjet = this.getTypeObjetFromInt(Int32.Parse(parsedString[2]));
                this.idObjet = Int32.Parse(parsedString[3]);
                this.message = parsedString[4];
                this.date = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, Int32.Parse(parsedString[5]), Int32.Parse(parsedString[6]), Int32.Parse(parsedString[7]));
            }
            catch
            {
                throw new Exception("Format de message incorrect");
            }
        }

        #endregion

        #region Convertisseurs TYPE->INT & INT->TYPE

        //Permet de convertir le TypeMessage en int pour le message
        public TypeMessage getTypeMessageFromInt(int _type)
        {
            switch (_type)
            {
                case 0:
                    return TypeMessage.Erreur;
                case 1:
                    return TypeMessage.Requete;
                case 2:
                    return TypeMessage.Reponse;
                case 3:
                    return TypeMessage.Information;
                default:
                    throw new Exception("Type message inexistant");
            }
        }

        public int getTypeMessageFromEnum(TypeMessage _type)
        {
            switch (_type)
            {
                case TypeMessage.Erreur:
                    return 0;
                case TypeMessage.Requete:
                    return 1;
                case TypeMessage.Reponse:
                    return 2;
                case TypeMessage.Information:
                    return 3;
                default:
                    throw new Exception("Type message inexistant");
            }
        }

        //Permet de convertir le int du message en TypeMessage
        public TypeObjet getTypeObjetFromInt(int typeObjet)
        {
            switch(typeObjet)
            {
                case 0:
                    return TypeObjet.SystemeGlobal;
                case 1:
                    return TypeObjet.Imprimante;
                case 2:
                    return TypeObjet.CapteurArriveePiece;
                case 3:
                    return TypeObjet.CapteurArriveeCarton;
                case 4:
                    return TypeObjet.MiseEnPalette;
                case 5:
                    return TypeObjet.CapteurArriveePalette;
                case 6:
                    return TypeObjet.Carton;
                case 7:
                    return TypeObjet.Palette;
                case 8:
                    return TypeObjet.Lot;
                case 9:
                    return TypeObjet.Commande;
                case 10:
                    return TypeObjet.Plastifieur;
                default:
                    throw new Exception("Type objet incorrect");
            }
        }

        public int getTypeObjetFromEnum(TypeObjet _type)
        {
            switch (_type)
            {
                case TypeObjet.SystemeGlobal:
                    return 0;
                case TypeObjet.Imprimante:
                    return 1;
                case TypeObjet.CapteurArriveePiece:
                    return 2;
                case TypeObjet.CapteurArriveeCarton:
                    return 3;
                case TypeObjet.MiseEnPalette:
                    return 4;
                case TypeObjet.CapteurArriveePalette:
                    return 5;
                case TypeObjet.Carton:
                    return 6;
                case TypeObjet.Palette:
                    return 7;
                case TypeObjet.Lot:
                    return 8;
                case TypeObjet.Commande:
                    return 9;
                case TypeObjet.Plastifieur:
                    return 10;
                default:
                    throw new Exception("Type objet incorrect");
            }
        }

        #endregion

    }
}